package com.crm.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.crm.entity.Module;
import com.crm.entity.Role;
import com.crm.entity.UserRole;
import com.crm.service.ModuleService;
import com.crm.util.Result;
import com.crm.util.TreeNode;
import com.crm.util.TreeNodeUtil;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author crm
 * @since 2020-06-05
 */
@RestController//标注当前类是controller类，controller用 于处理客户端请求，加Rest表示当前类的所有方法都返回json数据，不走视图
public class ModuleController {
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private ModuleService moduleService;//module的业务层父接口

    /**
     *查询某角色下的模块
     * @param rid
     * @return 树形菜单下的List<TreeNode>
     */
    @RequestMapping("getSysRightsJsonLayUI") // 客户端请求地址
    public Object getSysRightsJsonLayUI(Integer rid){//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        List<Module> modulelist=moduleService.GetSysRightsJsonLayUI(rid);//调用service层方法GetSysRightsJsonLayUI()，通过rid（角色id）来进行查询数据
        List<TreeNode> TreeList= TreeNodeUtil.getTree(modulelist);//封装返回数据
        //把modulelist转 换成treelist数据
        return TreeList;
    }

    @RequestMapping("GetRightsModile") // 客户端请求地址
    public Object getRightsModile(@RequestParam("ids") String[] ids) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        List<Module> moduleList = moduleService.getRightsModile(ids);//调用service层方法getRightsModile()，通过rid（角色id）来进行查询数据
        List<TreeNode> treeNodeList = TreeNodeUtil.getTree(moduleList);//封装返回数据
        return treeNodeList;
    }
    /**
     *查询某角色下的模块
     * @param
     * @return 被勾选了部分节点的树形菜单下的List<TreeNode>
     */
    @RequestMapping("getModulesByRoleIdLayUI") // 客户端请求地址
    public Object getModulesByRoleIdLayUI(Integer rid){//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        //1.首选需要一个完整的树
        //1-1，需要完整的树，先得有完整的模块，然后调用TreeNodeUtil里的getTree转化
        List<Module> allModuleList = moduleService.getAllModule();
        //1-2，转化成树
        List<TreeNode> allTreeList = TreeNodeUtil.getTree(allModuleList);
        //2.获取这个角色拥有的模块
        List<Module> moduleList = moduleService.GetSysRightsJsonLayUI(rid);
        //3.如果角色模块的某个id和树的某个节点的id一致，就把这个节点check=true
        return TreeNodeUtil.getCheckedTree(moduleList, allTreeList);
    }

    @RequestMapping("getAllModuleLayUI") // 客户端请求地址
    public Object getModules(){//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        //1.首选需要一个完整的树
        //1-1，需要完整的树，先得有完整的模块，然后调用TreeNodeUtil里的getTree转化
        List<Module> allModuleList = moduleService.list();//调用mybatis plus的内 置service层方法list()，全查所有数据
        //1-2，转化成树
        List<TreeNode> allTreeList = TreeNodeUtil.getTree(allModuleList);


        return allTreeList;
    }
    @RequestMapping("getModuleById") // 客户端请求地址
    public Object GetModuleById(Integer mid){//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙

        Module m=moduleService.getById(mid);//调用mybatis plus的内 置service层方法getById()，通过mid（模块）数据
        return new Result(0, "", m);
    }
    @RequestMapping("createModule") // 客户端请求地址
    public Object createModule(Module module) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙

        ////根据 entity 条件，查询一条记录
        Module mname = moduleService.getOne(new QueryWrapper<Module>().eq("mname",module.getMname()).eq("parentId",module.getParentId()), false);
        if (mname != null) {
            return new Result(1, "添加失败，该名称已存在！");//把查到的结果数据，返回给前端ajax的请求
        }

        boolean insertModule = moduleService.save(module);//调用mybatis plus的内 置service层方法save()

        if (insertModule == true) {//判断结果

            return new Result(0, "添加成功") {//把查到的结果数据，返回给前端ajax的请求
            };

        }
        return new Result(1, "添加失败");//把查到的结果数据，返回给前端ajax的请求
    }

    @RequestMapping("updateModule") // 客户端请求地址
    public Object updateModule(Module module) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        Module mname = moduleService.getOne(new QueryWrapper<Module>().eq("mname", module.getMname()));
        if (mname != null && !mname.getMid().equals(mname.getMid())) {
            return new Result(1, "修改失败，该名称已存在！");//把查到的结果数据，返回给前端ajax的请求
        }
        boolean updateModule = moduleService.updateById(module);//调用mybatis plus的内 置service层方法updateById()

        if (updateModule == true) {//判断结果

            return new Result(0, "修改成功");//把查到的结果数据，返回给前端ajax的请求

        }
        return new Result(1, "修改失败");//把查到的结果数据，返回给前端ajax的请求
    }

    @RequestMapping("deleteModule") // 客户端请求地址
    public Object DeleteModule(Integer mid) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        // 删除前先判断该部门下是否有数据（员工）
        List<Module> list = moduleService.list(new QueryWrapper<Module>().eq("mid", mid));
        if (!list.isEmpty()) {
            return new Result(1, "该模块下有数据，删除失败！");//把查到的结果数据，返回给前端ajax的请求
        }
        boolean removeById = moduleService.removeById(mid);//调用mybatis plus的内 置service层方法removeById()

        if (removeById == true) {//判断结果

            return new Result(0, "删除成功");//把查到的结果数据，返回给前端ajax的请求

        }
        return new Result(1, "删除失败");//把查到的结果数据，返回给前端ajax的请求
    }

}
